497. Random Point in Non-overlapping Rectangles - LeetCode Solution


Binary Search

Python Code:

class Solution:
    def numPoints(self, rect) -> int:
        x1, y1, x2, y2 = rect
        return (x2 - x1 + 1) * (y2 - y1 + 1)


    def __init__(self, rects: List[List[int]]):
        self.rects = rects
        self.presum = [0]
        for i in range(len(rects)):
            self.presum.append(self.presum[-1] + self.numPoints(rects[i]))
        

    def pick(self) -> List[int]:
        n =  random.randint(1, self.presum[-1])
        i = bisect.bisect_left(self.presum, n) 
        n -= self.presum[i-1]
        x1, y1, x2, y2 = self.rects[i-1]
        q, r = divmod(n, x2 - x1 + 1)
        if r:
            return [x1 + r -1, y1 + q]
        return [x2, y1 + q -1]


# Your Solution object will be instantiated and called as such:
# obj = Solution(rects)
# param_1 = obj.pick()


Comments

Submit
0 Comments
More Questions

25A - IQ test
785A - Anton and Polyhedrons
1542B - Plus and Multiply
306A - Candies
1651C - Fault-tolerant Network
870A - Search for Pretty Integers
1174A - Ehab Fails to Be Thanos
1169A - Circle Metro
780C - Andryusha and Colored Balloons
1153A - Serval and Bus
1487C - Minimum Ties
1136A - Nastya Is Reading a Book
1353B - Two Arrays And Swaps
1490E - Accidental Victory
1335A - Candies and Two Sisters
96B - Lucky Numbers (easy)
1151B - Dima and a Bad XOR
1435B - A New Technique
1633A - Div 7
268A - Games
1062B - Math
1294C - Product of Three Numbers
749A - Bachgold Problem
1486B - Eastern Exhibition
1363A - Odd Selection
131B - Opposites Attract
490C - Hacking Cypher
158B - Taxi
41C - Email address
1373D - Maximum Sum on Even Positions